%ultima actualizacion 28 de Septiembre 2010
    %NOTA: como parametro de entrada esta vectorimagen que es una estructura
    %asi--> VectorGris.caraGris, o si es en color VectorColor.caraRoja, o azul
    %o verde, reconoce el conjunto de K clase de caras de entrenamiento, para mirar sus
    %errores maximos y minmos por cada K clase
    
%EigenVectorC,ProyeccionC,PSI,EigenValorC
%Esp1--->componente rojo
%Esp2--->componente verde
%Esp3--->componente azul

%Realizar otra función para la detección, este es un ejemplo para que te des cuenta la función de subversion
   
function[]=correRecono(Esp1,Esp2,Esp3,ErrorE,ErrorM,car,tipoplano)
    clc;   
    
    [caras, ruta] = uigetfile( ...uigetfile
     {'*.pgm; *.jpg; *.tif; *.gir; *.ppm','All Image files'}, ...
        'Seleccione las Imagenes de Caras ','MultiSelect', 'on');

    if isequal(caras,0)
        sprintf('\n ***************** El Usuario Seleccionó Cancelar ***************** \n')
        return;
    else
        n=length(caras);
        for i=1:n
            dircara = strcat(ruta, caras{i});
            img = im2double(imread(dircara));
            imagen(i).caras=im2uint8(img); %almacena en una estructura las imagenes cargadas
        end
        sprintf('\n ***************** Imagenes ya Cargadas ***************** \n')
    end     
    %--------------------Concatenación de la imagen en un vector----------
    [VectImaTest]=ImagenVector(imagen,tipoplano);  
    
     %-------------------Reconocimiento e Identificación--------------------
    switch(tipoplano)
        case 'rgb'
        tam=size(VectImaTest.caraRoja,2);  
        ek1=zeros(tam,1); ek2=zeros(tam,1); ek3=zeros(tam,1);
        em1=zeros(tam,1); em2=zeros(tam,1); em3=zeros(tam,1);
        recono1=zeros(tam,1); recono2=zeros(tam,1);recono3=zeros(tam,1);
        ident1=zeros(tam,1);ident2=zeros(tam,1);ident3=zeros(tam,1);
        c1=zeros(tam,1);c2=zeros(tam,1);c3=zeros(tam,1);
        
        for i=1:tam
            
            [EkR,ER,EmR,ekR,emR,reconoR,identR,cR]=ReconocimientoFinal(VectImaTest.caraRoja(:,i),Esp1.EigenVectorC,Esp1.ProyeccionC,Esp1.PSI,Esp1.EigenValorC,ErrorE.EKmaximoR,ErrorE.EKminimoR,ErrorE.espR,ErrorM.EMmaximoR,ErrorM.EMminimoR,car);
            [EkG,EG,EmG,ekG,emG,reconoG,identG,cG]=ReconocimientoFinal(VectImaTest.caraVerde(:,i),Esp2.EigenVectorC,Esp2.ProyeccionC,Esp2.PSI,Esp2.EigenValorC,ErrorE.EKmaximoG,ErrorE.EKminimoG,ErrorE.espG,ErrorM.EMmaximoG,ErrorM.EMminimoG,car);
            [EkB,EB,EmB,ekB,emB,reconoB,identB,cB]=ReconocimientoFinal(VectImaTest.caraAzul(:,i),Esp3.EigenVectorC,Esp3.ProyeccionC,Esp3.PSI,Esp3.EigenValorC,ErrorE.EKmaximoB,ErrorE.EKminimoB,ErrorE.espB,ErrorM.EMmaximoB,ErrorM.EMminimoB,car);

            [recoident,clasifico]=Tasareconocimiento3(reconoR,reconoG,reconoB,identR,identG,identB);
            
            ek1(i)=ekR; ek2(i)=ekG; ek3(i)=ekB;
            em1(i)=emR; em2(i)=emG; em3(i)=emB;
            recono1(i)=reconoR; recono2(i)=reconoG; recono3(i)=reconoB;
            ident1(i)=identR; ident2(i)=identG; ident3(i)=identB;
            c1(i)=cR; c2(i)=cG; c3(i)=cB;
            recoidentRGB(i).tasa=recoident; clasificoRGB(i)=clasifico;
        end
        %Guardamos los clasificadores de salida
        save RECONOCIMIENTO_RGB.mat em1 em2 em3 ek1 ek2 ek3 c1 c2 c3 ident1 ident2 ident3 recoidentRGB clasificoRGB;
        
        case 'hsv'
            tam=size(VectImaTest.caraS,2);  
            ek1=zeros(tam,1); ek2=zeros(tam,1); 
            em1=zeros(tam,1); em2=zeros(tam,1); 
            recono1=zeros(tam,1); recono2=zeros(tam,1);
            ident1=zeros(tam,1);ident2=zeros(tam,1);
            c1=zeros(tam,1);c2=zeros(tam,1);
            
            for i=1:tam
                
                [EkS,ES,EmS,ekS,emS,reconoS,identS,cS]=ReconocimientoFinal(VectImaTest.caraS(:,i),Esp2.EigenVectorC,Esp2.ProyeccionC,Esp2.PSI,Esp2.EigenValorC,ErrorE.EKmaximoS,ErrorE.EKminimoS,ErrorE.espS,ErrorM.EMmaximoS,ErrorM.EMminimoS,car);
                [EkV,EV,EmV,ekV,emV,reconoV,identV,cV]=ReconocimientoFinal(VectImaTest.caraV(:,i),Esp3.EigenVectorC,Esp3.ProyeccionC,Esp3.PSI,Esp3.EigenValorC,ErrorE.EKmaximoV,ErrorE.EKminimoV,ErrorE.espV,ErrorM.EMmaximoV,ErrorM.EMminimoV,car);

                [recoident,clasifico]=Tasareconocimiento2(reconoS,reconoV,identS,identV);
                
                ek1(i)=ekS; ek2(i)=ekV;
                em1(i)=emS; em2(i)=emV; 
                recono1(i)=reconoS; recono2(i)=reconoV; 
                ident1(i)=identS; ident2(i)=identV; 
                c1(i)=cS; c2(i)=cV; 
                recoidentHSV(i).tasa=recoident; clasificoHSV(i)=clasifico;
            end
            %Guardamos los clasificadores de salida
            save RECONOCIMIENTO_HSV.mat em1 em2 ek1 ek2 c1 c2 ident1 ident2 recoidentHSV clasificoHSV;
            
        case 'gris'
            
            tam=size(VectImaTest.caraGris,2);  
            ek1=zeros(tam,1); 
            em1=zeros(tam,1);
            recono1=zeros(tam,1);
            ident1=zeros(tam,1);
            c1=zeros(tam,1);
            
            for i=1:tam   
                
                [EkG,EG,EmG,ekG,emG,reconoG,identG,cG]=ReconocimientoFinal(VectImaTest.caraGris(:,i),Esp1.EigenVectorC,Esp1.ProyeccionC,Esp1.PSI,Esp1.EigenValorC,ErrorE.EKmaximoG,ErrorE.EKminimoG,ErrorE.espG,ErrorM.EMmaximoG,ErrorM.EMminimoG,car);

                [recoident,clasifico]=Tasareconocimiento1(reconoG,identG);
                
                ek1(i)=ekG; 
                em1(i)=emG;  
                recono1(i)=reconoG;  
                ident1(i)=identG; 
                c1(i)=cG; 
                recoidentGris(i).tasa=recoident; clasificoGris(i)=clasifico;
            end
            %Guardamos los clasificadores de salida
            save RECONOCIMIENTO_GRIS.mat em1 ek1 c1 ident1 recoidentGris clasificoGris;
            
    end

end
